#include <iostream>
#include <vector>
#include <unistd.h>
#include <signal.h>
using namespace std;

// #define BLOCK_SIGNAL 2
#define MAX_SIGNUM 42

static sigset_t block,oblock;
//把想屏蔽的信号放入数组
static vector<int> signum = {2};
static int flag;

void show_pending(const sigset_t& pending)
{
    for(int signo = MAX_SIGNUM; signo>= 1;signo--)
    {
        if(sigismember(&pending,signo))
            cout << 1;
        else
            cout << 0;
    }
    cout << endl;
}
static void myhandler(int signo)
{
    if(flag == 0)
    {
        cout << signo <<"号信号被抵达 " << endl;
        flag = 1;
        cout << flag << endl;
    }
    else
    {
        sigprocmask(SIG_SETMASK,&block,&oblock);
        flag = 0;
    }

}
int main()
{
    //1.屏蔽制定的信号
    sigset_t pending;
    //1.1 初始化
    sigemptyset(&block);
    sigemptyset(&oblock);
    sigemptyset(&pending);

    //添加要屏蔽的信号
    for(const auto& sig:signum)
    {
        sigaddset(&block,sig);
    }
    //捕捉信号，做自定义动作
    for(const auto& sig:signum)
    {
        signal(sig,myhandler);
    }
    //开始屏蔽，设置进内核(进程)
    sigprocmask(SIG_SETMASK,&block,&oblock);

    cout << getpid() << endl;
    //2.打印pending信号集
    int cnt = 10;
    while(true)
    {
        //初始化
        sigemptyset(&pending);
        //获取
        sigpending(&pending);
        //打印
        show_pending(pending);

        sleep(1);
        if(--cnt == 0)
        {
            cout << "解除对信号的屏蔽 " << endl;
            sigprocmask(SIG_SETMASK,&oblock,&block);//一旦对特定信号解除屏蔽，一般操作系统至少立马递达一个信号！
            cout << "继续" << endl;
            
        }
    }
    return 0;
}